﻿using StackExchange.Redis;
using TeachlyQBank.DbPool;
using TeachlyQBank.Models;
using NLog;
using System.Data;
using System.Text.Json;
using System.Collections.Generic;

namespace TeachlyQBank.DbServer
{
    public class CourseServer
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private readonly MySqlConnectionAdapter _mysql; // 操作mysql的类
        private readonly IConnectionMultiplexer _redis;  // 操作redis的类
        private readonly Logger _logger;  //记录日志的类

        // 完成依赖注入
        public CourseServer(MySqlConnectionAdapter mysql, IConnectionMultiplexer redis, IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
            _redis = redis;
            _logger = LogManager.GetCurrentClassLogger();
            _mysql = mysql;
        }
        //功能：用于查询出需要修改的课程信息单独展示在一个页面
        //参数：传入一个course里面包含了修改课程的名称
        //返回:执行成分返回数据库影响的条数1,失败返回-1
        public Course SltUpdServer(Course course)
        {
            _mysql.Open();
            string query = "SELECT * FROM T_COURSE WHERE course_name=@course_name";
            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                {"@course_name",course.course_name !}
            };
            DataSet data = _mysql.ExecuteQuery(query, parameters);
            if (data == null || data.Tables[0].Rows.Count == 0)
            {
                _mysql.Close();
                // 查询出错
                _logger.Error($"查询出错,错误的sql语句:{_mysql.GetLastExecutedSql()},错误的信息:{_mysql.GetLastError()}");
                return null;
            }
            else
            {
                Course course1 = new Course();

                foreach (DataRow row in data.Tables[0].Rows)
                {
                    course1.course_id = Guid.Parse(row["course_id"].ToString());
                    course1.course_name = row["course_name"].ToString();
                    course1.course_desc = row["course_desc"].ToString();
                    course1.teacher_id = row["teacher_id"].ToString();

                    break;
                }
                _mysql.Close();
                return course1;
            }

        }
        //功能：用于修改的课程信息
        //参数：传入一个course里面包含了修改课程的ID
        //返回:执行成分返回数据库影响的条数1,失败返回-1
        public int UpdServer(Course course)
        {
            _mysql.Open();
            string query = "UPDATE T_COURSE SET course_name=@course_name,course_desc=@course_desc,teacher_id=@teacher_id WHERE course_id=@course_id;";
            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                 { "@course_id", course.course_id ! },
                { "@course_name", course.course_name ! },
                { "@course_desc", course.course_desc !},
                { "@teacher_id", course.teacher_id !},

            };
            int count = _mysql.ExecuteNonQuery(query, parameters);

            if (count > 0)
            {
                _logger.Info($"对:{course.course_name}进行了更改,课程简介:{course.course_desc},本次花费了{_mysql.GetLastExecutionTime()}毫秒");
                _mysql.Close();
                return count;
            }
            else
            {
                _logger.Error($"更改用户出现错误,错误的sql语句:{_mysql.GetLastExecutedSql()},错误的信息:{_mysql.GetLastError()}");
                _mysql.Close();
                return -1;
            }
        }
        //功能：根据课程名称查询出课程信息
        //参数：传入一个course里面包含了修改课程的名称
        //返回:执行成分返回数据库影响的条数1,失败返回-1
        public List<Course> Slt2Server(Course course)
        {
            _mysql.Open();
            string query = "SELECT * FROM T_COURSE WHERE course_name LIKE @course_name";
            Dictionary<string, object> parameters = new Dictionary<string, object>
    {
        {"@course_name", "%" + course.course_name + "%" }
    };
            DataSet data = _mysql.ExecuteQuery(query, parameters);
            _mysql.Close();

            if (data == null || data.Tables[0].Rows.Count == 0)
            {
                // 查询出现错误
                _logger.Error($"查询出错，错误的SQL语句：{_mysql.GetLastExecutedSql()}，错误的信息：{_mysql.GetLastError()}");
                return null;
            }

            List<Course> resultList = new List<Course>();

            foreach (DataRow row in data.Tables[0].Rows)
            {
                Course newCourse = new Course();

                newCourse.course_name = row["course_name"].ToString();
                newCourse.course_desc = row["course_desc"].ToString();
                newCourse.teacher_id = row["teacher_id"].ToString();


                resultList.Add(newCourse);
            }

            return resultList;
        }
        // 功能:向数据库提交创建新课程的请求
        // 参数:输入一个Course类型的数据做为要创建的课程
        // 返回:执行成功返回数据库影响数据的条数1,失败返回-1
        public int AddCourseServer(Course course)
        {
            _mysql.Open();
            string query = "insert into T_COURSE(course_id,course_name,course_desc,teacher_id) " +
                "values(@course_id,@course_name,@course_desc,@teacher_id)";

            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                { "@course_id", Guid.NewGuid() },
                { "@course_name", course.course_name ! },
                { "@course_desc", course.course_desc !},
                { "@teacher_id", course.teacher_id !},
            };

            int count = _mysql.ExecuteNonQuery(query, parameters);

            if (count > 0)
            {
                _logger.Info($"添加了一个新课程:{course.course_name},课程简介:{course.course_desc},本次花费了{_mysql.GetLastExecutionTime()}毫秒");
                _mysql.Close();
                return count;
            }
            else
            {
                _logger.Error($"添加课程出现错误,错误的sql语句:{_mysql.GetLastExecutedSql()},错误的信息:{_mysql.GetLastError()}");
                _mysql.Close();
                return -1;
            }
        }
        // 功能:根据一个用户的账号删除一个用户
        // 参数:传入一个course里面包含了要删除课程的ID
        // 返回:执行成分返回数据库影响的条数1,失败返回-1
        public int DelCourseServer(Course course)
        {
            _mysql.Open();
            string query = "DELETE FROM T_COURSE WHERE course_name=@course_name";
            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                {"@course_name",course.course_name }
            };
            int count = _mysql.ExecuteNonQuery(query, parameters);
            if (count > 0)
            {
                _logger.Info($"删除了一课程:{course.course_name},课程ID:{course.course_id},本次花费了{_mysql.GetLastExecutionTime()}毫秒");
                _mysql.Close();
                return count;
            }
            else
            {
                _logger.Error($"删除用户出现错误,错误的sql语句:{_mysql.GetLastExecutedSql()},错误的信息:{_mysql.GetLastError()}");
                _mysql.Close();
                return -1;
            }
        }

        // 功能：用于查询数据库里的所有用户并展示在前端页面
        // 参数:不需要任何参数
        // 返回:查询成功返回一个List<course>包含了所有的用户信息，查询失败返回null
        public List<Course> SltServer()
        {
            _mysql.Open();

            string query = "SELECT * FROM T_COURSE";

            DataSet data = _mysql.ExecuteQuery(query);
            if (data == null || data.Tables[0].Rows.Count == 0)
            {
                _mysql.Close();
                // 查询出先错误
                _logger.Error($"查询出错,错误的sql语句:{_mysql.GetLastExecutedSql()},错误的信息:{_mysql.GetLastError()}");
                return null;
            }
            else
            {
                List<Course> resultList = new List<Course>();

                foreach (DataRow row in data.Tables[0].Rows)
                {
                    Course newCourse = new Course();

                    newCourse.course_name = row["course_name"].ToString();
                    newCourse.course_desc = row["course_desc"].ToString();
                    newCourse.teacher_id = row["teacher_id"].ToString();

                    resultList.Add(newCourse);
                }
                _mysql.Close();
                return resultList;
            }
        }

        //功能：用于查询出需要修改的课程信息单独展示在一个页面
        //参数：传入一个course里面包含了修改课程的名称
        //返回:执行成分返回数据库影响的条数1,失败返回-1
        
    }
}








